// 文件路径: dbms/service/LocalDbmsService.java
package com.dbms.service;

import com.dbms.DbmsCore;
import com.dbms.common.QueryResult;

/**
 * IDbmsService 接口的**本地实现类**，适用于单机/本地数据库模式。
 * 核心职责：作为上层组件（如UI、业务逻辑）与底层数据库内核（DbmsCore）之间的桥接层，
 * 将接口定义的所有数据库操作直接委托给本地 DbmsCore 实例执行，无远程网络交互，
 * 是本地部署模式下的核心服务载体。
 */
public class LocalDbmsService implements IDbmsService {

    /**
     * 本地数据库内核实例（DbmsCore）：封装了数据库的核心逻辑（SQL执行、事务管理、UDF注册等），
     * 本服务类的所有操作最终都通过此实例完成。
     */
    private final DbmsCore dbmsCore;

    /**
     * 构造方法：初始化本地数据库服务，创建 DbmsCore 实例（本地模式）
     * 【核心修正】通过传入 null 作为 nodeId，告知 DbmsCore 以“单机本地模式”启动，
     * 此时内核会使用默认数据库文件名（如 "standalone.db"），无需分布式节点配置。
     */
    public LocalDbmsService() {
        // 传入 null 表示本地模式：DbmsCore 内部会忽略分布式相关逻辑，使用本地存储和资源
        this.dbmsCore = new DbmsCore(null);
    }

    /**
     * 【实现接口】动态编译并注册UDF（用户自定义函数）
     * 功能委托：直接调用 DbmsCore 的 registerUdf 方法，由内核完成UDF的编译、校验和注册逻辑
     * @param functionName SQL中调用UDF的名称（如 "REVERSE"）
     * @param sourceCode UDF的完整Java源代码（需符合系统规范）
     * @return 注册结果消息（成功提示或错误详情，由 DbmsCore 生成）
     */
    @Override
    public String registerUdf(String functionName, String sourceCode) {
        return dbmsCore.registerUdf(functionName, sourceCode);
    }

    /**
     * 【实现接口】执行SQL命令
     * 功能委托：将SQL执行请求转发给 DbmsCore，由内核处理SQL解析、优化、执行和结果封装
     * @param sql 待执行的SQL语句（支持查询、DML、DDL等类型）
     * @return SQL执行结果（QueryResult 对象，包含结果集、受影响行数、错误信息等）
     */
    @Override
    public QueryResult processSql(String sql) {
        return dbmsCore.processSql(sql);
    }

    /**
     * 【实现接口】用户身份认证（登录鉴权）
     * 功能委托：由 DbmsCore 校验用户名和密码的合法性（如匹配系统内置用户或用户表数据）
     * @param username 待验证的用户名
     * @param password 待验证的密码
     * @return 认证结果：true 表示认证成功，false 表示失败
     */
    @Override
    public boolean authenticate(String username, String password) {
        return dbmsCore.authenticate(username, password);
    }

    /**
     * 【实现接口】获取当前登录用户名
     * 功能委托：从 DbmsCore 中获取当前活跃会话的用户名（内核维护会话状态）
     * @return 当前登录用户名（未登录时返回 null 或空字符串，由 DbmsCore 定义）
     */
    @Override
    public String getCurrentUser() {
        return dbmsCore.getCurrentUser();
    }

    /**
     * 【实现接口】检查当前会话是否处于事务中
     * 功能委托：由 DbmsCore 判断当前会话的事务状态（内核维护事务上下文）
     * @return 事务状态：true 表示在事务中（未提交/未回滚），false 表示不在事务中
     */
    @Override
    public boolean isInTransaction() {
        return dbmsCore.isInTransaction();
    }

    /**
     * 【实现接口】关闭数据库服务，释放核心资源
     * 功能委托：调用 DbmsCore 的 shutdown 方法，触发本地数据库内核的资源清理流程
     * （如刷回脏页、关闭磁盘文件、释放内存缓存等）
     */
    @Override
    public void close() {
        dbmsCore.shutdown();
    }
}